package pruebas;

import modelo.Escenario;
import modelo.Jugador;
import modelo.naves.Avioneta;
import modelo.naves.NaveAlgo42;
import modelo.util.Vector;
import org.junit.*;

import static org.junit.Assert.*;

public class TestEscenario {
	private Escenario escenario;
	private Vector p1 = new Vector (1,1);
	private Vector p2 = new Vector (1,0);
	private Jugador jugador;
	
	@Before
	public void setUp(){
		jugador = new Jugador();
		jugador.setVidas(3);
		escenario = new Escenario(jugador);		
	}
	
	@Test
	public void testAgregarContieneObjeto(){
		Avioneta avioneta = new Avioneta(p1, p2);
		Avioneta avioneta2 = new Avioneta(p1, p2);
		escenario.agregarObjeto(avioneta);
		assertTrue("No encuentra un objeto que contiene", 
				escenario.contiene(avioneta));
		//agrego otro objeto
		escenario.agregarObjeto(avioneta2);
		assertTrue("No encuentra otro objeto que contiene",
				escenario.contiene(avioneta2));
		assertEquals("No encuentra correctamente los dos elemenos contenidos",
				escenario.cantidadObjetos(),3);
				
	}

	@Test
	public void testObjetosActuar(){
		Avioneta nave = new Avioneta (p1, p2); 
		Avioneta nave2 = new Avioneta (p1, p2);
		escenario.agregarObjeto(nave);
		escenario.agregarObjeto(nave2);
		//las naves deben moverse
		escenario.objetosActuar();
		assertNotSame("los objetos no actuan adecuadamente", 
				p1, nave.getPosicion());
		assertNotSame ("los objetos no actuan adecuadamente", 
				p1, nave2.getPosicion());
		//chequeo que sigan en el escenario 
		// 2 objetos + 1 algo42
		assertTrue ("los objetos no actuan adecuadamente",
				escenario.cantidadObjetos() >= 3);
	} 
	
	@Test
	public void testChequearColisiones(){
		//colision entre nave algo42 y nave enemiga
		//creo ambas naves en el mismo lugar.
		//ambas deben morir y jugador debe descontar una vida.
		NaveAlgo42 algo42 = jugador.getAlgo42();
		Avioneta nave = new Avioneta (algo42.getPosicion(),p2);
		escenario.agregarObjeto(nave);
		escenario.chequearColisiones();
		assertFalse("la nave del algo 42 deberia haber muerto",
				algo42.seguirActuando());
		assertFalse("la nave enemiga debria haber muerto",
				nave.seguirActuando());
		assertFalse("la nave muerta no deberia estar en el escenario",
				escenario.contiene(nave));
		assertEquals("jugador deberia tener una vida menos",
				jugador.getVidas(),2);
		algo42 = jugador.getAlgo42();
		assertTrue("la nave del algo42 no se ha agregado nuevamente luego de chocar con otra nave",
				escenario.contiene(algo42));	
		}

}
	
	